{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "# imports\n",
    "\n",
    "import os\n",
    "from dotenv import load_dotenv\n",
    "from IPython.display import Markdown, display\n",
    "from openai import OpenAI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install youtube_transcript_api"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "from youtube_transcript_api import YouTubeTranscriptApi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load environment variables in a file called .env\n",
    "\n",
    "load_dotenv(override=True)\n",
    "api_key = os.getenv('OPENAI_API_KEY')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "\n",
    "class YouTubeWebLink:\n",
    "    def __init__(self, url):\n",
    "        self.url = url\n",
    "        self.video_id = self.get_video_id(url)\n",
    "        self.set_openai_client()\n",
    "        self.set_system_prompt()\n",
    "\n",
    "    def get_video_id(self, url):\n",
    "        \"\"\" extract youtube video id from url with regular expression \"\"\"\n",
    "        regex = r\"(?:v=|be/)([a-zA-Z0-9_-]{11})\"\n",
    "        match = re.search(regex, url)\n",
    "        if match:\n",
    "            return match.group(1)\n",
    "        else:\n",
    "            raise ValueError(\"Probably not a YouTube URL\")\n",
    "        \n",
    "    def set_openai_client(self):\n",
    "        self.openai = OpenAI()\n",
    "        \n",
    "    def set_system_prompt(self, system_prompt=None):\n",
    "        \"\"\" set system prompt from youtube video \"\"\"\n",
    "        self.system_prompt = \"\"\"\n",
    "        You are a skilled explainer and storyteller who specializes in summarizing YouTube video transcripts in a way that's both engaging and informative. \n",
    "        Your task is to:\n",
    "        - Capture key points and main ideas of the video\n",
    "        - Structure your summary with in clear sections\n",
    "        - Include important details, facts, and figures mentioned\n",
    "        - Never end your summary with a \"Conclusion\" section\n",
    "        - Keep the summary short and easy to understand\n",
    "        - Always format your response in markdown for better readability\n",
    "        \"\"\" if system_prompt is None else system_prompt\n",
    "\n",
    "    def get_transcript(self):\n",
    "        \"\"\" get transcript from youtube video \"\"\"\n",
    "        try:\n",
    "            print('Fetching video transcript...')\n",
    "            transcript = YouTubeTranscriptApi.get_transcript(self.video_id)\n",
    "            return \" \".join([item['text'] for item in transcript])\n",
    "        except Exception as e:\n",
    "            print(f\"Error fetching transcript: {e}\")\n",
    "            return None\n",
    "        \n",
    "    def get_summary_from_transcript(self, transcript):\n",
    "        \"\"\" summarize text using openai \"\"\"\n",
    "        try:\n",
    "            print('Summarizing video...')\n",
    "            response = self.openai.chat.completions.create(\n",
    "                model=\"gpt-4o-mini\",\n",
    "                messages=[\n",
    "                    {\"role\": \"system\", \"content\": self.system_prompt},\n",
    "                    {\"role\": \"user\", \"content\": f\"Summarize the following YouTube video transcript:\\n\\n{transcript}\"}\n",
    "                ]\n",
    "            )\n",
    "            return response.choices[0].message.content\n",
    "        except Exception as e:\n",
    "            print(f\"Error summarizing text: {e}\")\n",
    "            return None\n",
    "\n",
    "    def display_summary(self):\n",
    "        \"\"\" summarize youtube video \"\"\"\n",
    "        transcript = self.get_transcript()\n",
    "        summary = self.get_summary_from_transcript(transcript)\n",
    "        display(Markdown(summary))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [],
   "source": [
    "# video link and share link of same youtube video\n",
    "test_url_1 = \"https://www.youtube.com/watch?v=nYy-umCNKPQ&list=PLWHe-9GP9SMMdl6SLaovUQF2abiLGbMjs\"\n",
    "test_url_2 = \"https://youtu.be/nYy-umCNKPQ?si=ILVrQlKT0W71G5pU\"\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Test that we get same id\n",
    "video1, video2 = YouTubeWebLink(test_url_1), YouTubeWebLink(test_url_2)\n",
    "video1.video_id, video2.video_id"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "video1.display_summary()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "llms",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
